package config

import (
	"fmt"
	"github.com/fsnotify/fsnotify"
	"github.com/spf13/viper"
	"os"
)

var conf *Server

type Server struct {
	Zap    Zap    `mapstructure:"zap" json:"zap" yaml:"zap"`
	System System `mapstructure:"system" json:"system" yaml:"system"`
	Mysql  Mysql  `mapstructure:"mysql" json:"mysql" yaml:"mysql"`
	Redis  Redis  `mapstructure:"redis" json:"redis" yaml:"redis"`
	Es     Es     `mapstructure:"es" json:"es" yaml:"es"`
	Site   Site   `mapstructure:"Site" json:"Site" yaml:"Site"`
}

func Viper() error {
	var config string

	// 优先级: 环境变量 > 默认值
	if configEnv := os.Getenv("GVA_CONFIG"); configEnv == "" {
		config = "config.yaml"
		fmt.Printf("您正在使用config的默认值,config的路径为%v\n", "config.yaml")
	} else {
		config = configEnv
		fmt.Printf("您正在使用GVA_CONFIG环境变量,config的路径为%v\n", config)
	}

	v := viper.New()
	v.SetConfigFile(config)
	v.SetConfigType("yaml")

	if err := v.ReadInConfig(); err != nil {
		return fmt.Errorf("服务异常，找不到配置文件: %s \n", err)
	}
	v.WatchConfig()

	var _conf Server
	v.OnConfigChange(func(e fsnotify.Event) {
		fmt.Println("配置文件发生变化，重新加载:", e.Name)
		if err := v.Unmarshal(&_conf); err != nil {
			fmt.Println(err)
		}
	})

	if err := v.Unmarshal(&_conf); err != nil {
		return err
	}
	conf = &_conf
	return nil
}

func GetZapConfig() *Zap {
	return &(conf.Zap)
}

func GetMysqlConfig() *Mysql {
	return &(conf.Mysql)
}

func GetRedisConfig() *Redis {
	return &(conf.Redis)
}

func GetEsConfig() *Es {
	return &(conf.Es)
}
func GetSystemConfig() *System {
	return &(conf.System)
}

func GetSiteConfig() *Site {
	return &(conf.Site)
}

func SecureUrl(path string) string {
	config := GetSystemConfig()
	if config != nil {
		return config.Host + path
	}
	return ""
}
